package xyz.longicorn.driver.config;

import cn.dev33.satoken.context.model.SaRequest;
import cn.dev33.satoken.context.model.SaResponse;
import cn.dev33.satoken.interceptor.SaAnnotationInterceptor;
import cn.dev33.satoken.interceptor.SaRouteInterceptor;
import cn.dev33.satoken.router.SaRouteFunction;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaAnnotationInterceptor());
        // 简单的登录拦截
//        registry.addInterceptor(new SaRouteInterceptor())
//                .addPathPatterns("/**") // 要拦截的路由地址
//                .excludePathPatterns(
//                        "/druid/**",
//                        "/api/user/login",
//                        "/api/user/reg",
//                        "/api/user/forget",
//                        "/api/user/reset",
//                        "/swagger**",
//                        "/swagger-resources/**",
//                        "/v2/api-docs",
//                        "/picture/**"
//                );
        // 复杂的权限、登录拦截
//        registry.addInterceptor(new SaRouteInterceptor(new SaRouteFunction() {
//                    @Override
//                    public void run(SaRequest req, SaResponse res, Object handler) {
//                        // 登录认证 -- 拦截所有路由，并排除/user/doLogin 用于开放登录
//                        SaRouter.match("/**", "/user/doLogin", r -> StpUtil.checkLogin());
//
//                        // 角色认证 -- 拦截以 admin 开头的路由，必须具备 admin 角色或者 super-admin 角色才可以通过认证
//                        SaRouter.match("/admin/**", r -> StpUtil.checkRoleOr("admin", "super-admin"));
//
//                        // 权限认证 -- 不同模块认证不同权限
//                        SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
//                        SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
//
//                        // 甚至你可以随意的写一个打印语句
//                        SaRouter.match("/**", r -> System.out.println("----啦啦啦----"));
//
//                        // 连缀写法
//                        SaRouter.match("/**").check(r -> System.out.println("----啦啦啦----"));
//                    }
//                }))
//                .addPathPatterns("/**");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //映射static路径的请求到static目录下
//        registry.addResourceHandler("/static/**")
//                .addResourceLocations("classpath:/static/");
    }

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*");
    }
}
